/*	
	Universidad: Universidad Nacional de Río Cuarto (UNRC)
	Materia: Taller de Diseño de Software (Cod. 3306)
	Carrera: Licenciatura en Ciencias de la Computación
	Proyecto 2011: Compilador de un subconjunto del lenguaje C (C--).
	Integrantes:
		Bettiol, Matías Nicolas.
		Mattana, Diego Leonel.
*/

#ifndef _Lista_
#define _Lista_

typedef struct TElemLista{
	char *nombre;
	char *tipo;
	union{
		float valorF;
		int valorI;
	};
	int label;
	int offset;
	int constante;

}TElemLista;

typedef struct nodoLista{
	TElemLista e;
	struct nodoLista *sig;
}NodoLista;

typedef NodoLista* Lista;

// Retorna una nueva lista.
Lista openLista();

// Retorna 0 si e1 == e2 sino retorna 1.
int equal(TElemLista e1,  TElemLista e2);

// Inserta un nuevo elemento en la lista.
// Retorna 0 si no se puede insertar.
int add(Lista *l , TElemLista e);

// Borra el elemento "e" de la lista.
// Retorna 0 si el elemento es eliminado.
int del(Lista *l , TElemLista e);

//
int desapila(Lista *l);

// @param *ant retorna un puntero previo del elemento.
// Retorna 0 si es el primer elemento.
// Retorna 1 si no encuentra el elemento "e".
// Retorna 2 si el elemento "e" es encontrado en otra posicion distinta.
// Aviso: *ant siempre es modificado.
int find(Lista l ,  TElemLista e, Lista *ant);

// @param *ant retorna un puntero previo del elemento.
// Retorna un puntero al elemento "e".
TElemLista* findElemento(Lista l , const TElemLista e, Lista *ant);

// Retorna 0 si la lista esta vacia.
// Retorna 1 si la lista no esta vacia.
int vaciaLista(Lista l);

// Retorna el tipo de "nombre".
char* retornaTipo(Lista l, const char* nombre, Lista *ant);

// Retorna el subtope de la lista.
TElemLista* subTope(Lista *l);

// Retorna el tope de la lista.
TElemLista* tope(Lista *l);

// Retorna el primer elemento de la lista.
TElemLista* popLista(Lista *l);

// Imprime el elemento "e" de la lista.
void printTElemLista(const TElemLista e);

// Imprime la lista.
void printLista(Lista l);

// Imprime el codigo intermedio "e" de la lista.
void printCodigoIntermedio(const TElemLista e);

// Imprime la lista.
void printListaCodigoIntermedio(Lista l);

#endif
